package com.gov.ec.rsv.dao;

import java.util.List;

import org.apache.log4j.Logger;

import com.gov.ec.rsv.interfaces.ICrudDao;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 * La clase CrudDAO.
 *
 * @author IGM
 */
@Stateless(name = "adminCrud")
public class CrudDAO implements ICrudDao {

    /** La variable logger. */
    public static Logger logger = Logger.getLogger(CrudDAO.class);
    /** La variable em. */
    @PersistenceContext(unitName = "RSVCCIGMEJB")
    protected EntityManager em;

    /* (non-Javadoc)
	 * @see com.gov.ec.rsv.dao.ICrudDao#insertar(java.lang.Object)
	 */
    @Override
	public void insertar(Object entidad) throws Exception {
        try {
            em.persist(entidad);
        } catch (Exception e) {
            logger.error("No se puede insertar. ", e);
            throw new Exception(e.getMessage(), e);
        }
    }

    /* (non-Javadoc)
     * @see com.gov.ec.ptvop.dao.CrudDAOLocal#actualizar(java.lang.Object)
     */
  
    @Override
	public Object actualizar(Object entidad) {
        try { 
            entidad = em.merge(entidad);
 //         em.refresh(entidad);
        } catch (Exception e) {
            logger.error("No se puede actualizar. ", e);
        }
        return entidad;

    }

    /* (non-Javadoc)
     * @see com.gov.ec.ptvop.dao.CrudDAOLocal#eliminar(java.lang.Object)
     */
    @Override
	public void eliminar(Object entidad) throws Exception {
        try {
            this.em.remove(em.merge(entidad));
            em.flush();
        } catch (Exception e) {
            logger.error("No se puede eliminar. ", e);
            throw new Exception(e.getMessage(), e);
        }
    }

    /* (non-Javadoc)
	 * @see com.gov.ec.rsv.dao.ICrudDao#buscar(java.lang.Object, java.lang.Object)
	 */
    @Override
	public Object buscar(Object entidad, Object clave) {
        try {
            return em.find(entidad.getClass(), clave);
        } catch (Exception e) {
            logger.error("No se puede buscar. ", e);
            return null;
        }
    }
    
    
    /* (non-Javadoc)
	 * @see com.gov.ec.rsv.dao.ICrudDao#consultarTodo(java.lang.Object)
	 */
    @SuppressWarnings("unchecked")
	@Override
	public List<Object> consultarTodo(Object entidad) {
		List<Object> objetosDev = null;

		try {
			Query query = em.createQuery("from " + entidad.getClass().getSimpleName()); //$NON-NLS-1$
			objetosDev = query.getResultList();
		} catch (Exception e) {
			System.err.println("Error:" + e.getMessage()); //$NON-NLS-1$
			e.printStackTrace();
		}
		return objetosDev;
	}
    
    /* (non-Javadoc)
	 * @see com.gov.ec.rsv.dao.ICrudDao#consultarMaxCode(java.lang.Object, java.lang.String)
	 */
    @Override
	public Integer consultarMaxCode(Object obj,String campo){
	    	Integer id=0 ;
	    	try {
	            Query query = em.createQuery("select max(o."+campo+" )+1 from "+ obj.getClass().getSimpleName()+" o");
	            id =(Integer) query.getSingleResult();
	        } catch (Exception e) {
	            logger.error(e);
	        }
	        return id;
	    }
    
    /* (non-Javadoc)
	 * @see com.gov.ec.rsv.dao.ICrudDao#consultaGeneral(java.lang.String)
	 */
    @SuppressWarnings("unchecked")
	@Override
    public List<Object> consultaGeneral(String sql){
    	List<Object> objetosDev = null;

		try {
			Query query = em.createQuery(sql); //$NON-NLS-1$
			objetosDev = query.getResultList();
		} catch (Exception e) {
			System.err.println("Error:" + e.getMessage()); //$NON-NLS-1$
			e.printStackTrace();
		}
		return objetosDev;
    }
}
